//
// Created by WWR on 2025/7/27.
//

#include "App_Thread.h"
#include "FreeRTOS.h"
#include "task.h"
#include "st_log.h"
#include "W9825G6.h"
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "benchmark/lv_demo_benchmark.h"
#include "semphr.h"
#include "touch_800x480.h"
#include "lv_port_indev_template.h"

static xTaskHandle InitThread_Handle = NULL;
static xTaskHandle LEDThread_Handle = NULL;

SemaphoreHandle_t LVGL_MuxSem_Handle =NULL;

/******************************************************************************************************
*	函 数 名: InitThread
*	入口参数: 无
*	返 回 值: 无
*	函数功能: 初始化整板，启动所有线程
*	说    明: 先初始化所有外设，然后启动所有线程
*******************************************************************************************************/

void InitThread_Start(void){
    #define TAG "InitThread"
    BaseType_t R_State = pdPASS;
    R_State = xTaskCreate((TaskFunction_t)InitThread,"InitThread",1024*3,NULL,0,(TaskHandle_t * )InitThread_Handle);
    if (R_State == pdPASS)  ST_LOG(LOG_I,TAG,"InitThread Create successful");
    else                    ST_LOG(LOG_E,TAG,"InitThread Create failed！");
}
/******************************************************************************************************
*	函 数 名: InitThread
*	入口参数: 无
*	返 回 值: 无
*	函数功能: 初始化整板，启动所有线程
*	说    明: 先初始化所有外设，然后启动所有线程
*******************************************************************************************************/

void InitThread(void){
    #define TAG "InitThread"
    BaseType_t R_State = pdPASS;

    taskENTER_CRITICAL();       // 进入临界区
    Touch_Init();				// 触摸屏初始化
    lv_init();					//	LVGL初始化
    lv_port_disp_init();		//	LVGL显示接口初始化
    lv_port_indev_init();	    // LVGL触摸接口初始化
    lv_demo_music();          // 运行官方例程 lv_demo_widgets ，进行LVGL测试

    LVGL_MuxSem_Handle = xSemaphoreCreateMutex();
    if (LVGL_MuxSem_Handle!= NULL )     ST_LOG(LOG_I,TAG,"LVGL_MuxSem Create successful");
    else                                ST_LOG(LOG_E,TAG,"LVGL_MuxSem Create failed！");

    R_State = xTaskCreate((TaskFunction_t)LED_Thread,"LED_Thread",128,(void*)1000,16,(TaskHandle_t * )LEDThread_Handle);
    if (R_State == pdPASS)  ST_LOG(LOG_I,TAG,"LED_Thread Create successful");
    else                    ST_LOG(LOG_E,TAG,"LED_Thread Create failed！");

    R_State = xTaskCreate((TaskFunction_t)LVGL_Thread,"LVGL_Thread",10 * 1024,NULL,2,(TaskHandle_t * )LEDThread_Handle);
    if (R_State == pdPASS)  ST_LOG(LOG_I,TAG,"LVGL_Thread Create successful");
    else                    ST_LOG(LOG_E,TAG,"LVGL_Thread Create failed！");

    taskEXIT_CRITICAL();  // 退出临界区
    vTaskDelete(InitThread_Handle);
}

/******************************************************************************************************
*	函 数 名: LED_Thread
*	入口参数: led_delay_ms - 闪烁间隔时间
*	返 回 值: 无
*	函数功能: LED心跳线程
*	说    明: 系统运行指示灯
*******************************************************************************************************/

void LED_Thread(void* led_delay_ms){
    for(;;){
        HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
        vTaskDelay(20);
        HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
        vTaskDelay(100);
        HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
        vTaskDelay(20);
        HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
        vTaskDelay((uint32_t)led_delay_ms);
    }
}

/******************************************************************************************************
*	函 数 名: LVGL_Thread
*	入口参数: parameter - 没有使用
*	返 回 值: 无
*	函数功能: LVGL处理线程
*	说    明:
*******************************************************************************************************/

void LVGL_Thread(void* parameter){
    for(;;){
        xSemaphoreTake(LVGL_MuxSem_Handle,portMAX_DELAY);
        lv_task_handler();
        xSemaphoreGive(LVGL_MuxSem_Handle);
        Touch_Scan();			// 触摸扫描，扫描频率不能低于10ms
        vTaskDelay(5);
    }
}

